package com.spider.site.pojo.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.assertj.core.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;
import com.spider.site.entity.SpiderHistoryResult;
import com.spider.site.entity.SpiderResult;
import com.spider.site.service.SpiderService;

/**
 * 蜘蛛侠 基本用到的方法
 * 
 * @author wq
 *
 */
@Component
public class SpiderUtil {

	@Autowired
	private SpiderService spiderService;

	/**
	 * 判断字符串是不是空
	 * 
	 * @return
	 */
	public boolean isNullOrEmpty(String... strings) {
		return Arrays.asList(strings).stream().allMatch(s -> s != null && !s.equals(""));
	}

	/**
	 * 热度格式，可能有些平台热度格式有点不同，需要格式化一次
	 */
	public String formatNumber(String number) {
		return Arrays.asList(number.split("")).stream().filter(string -> Pattern.matches("[0-9]", string.toString()))
				.reduce("", (x, y) -> x.toString() + y.toString()).toString();
	}

	/**
	 * 评论 合成
	 * 
	 * @param list
	 * @return
	 */
	public List<String> mergeList(List<String> name, List<String> comment) {
		List<String> list = new ArrayList<>();
		if (name != null && comment != null && name.size() > 0 && comment.size() > 0) {
			for (int i = 0; i < name.size(); i++) {
				list.add(name.get(i) + comment.get(i));
			}
		}
		return list;
	}

	/**
	 * 去除一些关键词
	 * 
	 * @param word
	 * @return
	 */
	public boolean filterWord(String word) {
		String[] fWords = "赠送,欢迎来到本直播间".split("\\,");
		return Arrays.asList(fWords).stream().anyMatch(w -> word.contains(String.valueOf(w)));
	}

	/**
	 * 数据持久
	 * 
	 * @param number
	 *            热度
	 * @param name
	 *            直播间名
	 * @param comments
	 *            评论
	 * @param author
	 *            主播
	 * @param spiderResult
	 *            蜘蛛侠对象
	 * @param image
	 *            头像
	 * @param url
	 *            直播间地址
	 * @param lasttime
	 *            上次直播
	 * @return
	 */
	public boolean savaSpiderData(String number, String name, List<String> comments, String author,
			SpiderResult spiderResult, String image, String url, String lastTime) {
		spiderResult = spiderService.getByURL(url);
		spiderResult.setAuthor(author);
		spiderResult.setName(name);
		if (number != null && !"".equals(number)) {
			spiderResult.setLiveNumber(Long.parseLong(number));
		}
		spiderResult.setImage(image);
		String comment = JSONObject.toJSON(comments).toString();// 处理一下评论
		spiderResult.setComments(comment);
		spiderResult.setLastTime(lastTime);
		return this.spiderService.editUrl(spiderResult);
	}

	/**
	 * 更新 标识抓取的状态
	 * 
	 * @return
	 */
	public boolean updateSpinStatus(SpiderResult result, int status) {
		result.setIsSpinging(status);// 更新状态
		if (status == 0) {
			this.saveHistorySpider(result);// 保存历史爬取结果
			result.setComments(null);
		}
		return this.spiderService.editUrl(result);
	}

	/**
	 * （公共）的异常处理
	 * 
	 * @return
	 */
	public SpiderResult exceptionCommon(Exception e, String url) {
		System.out.println("爬取过程中出现了意外，不要紧张，我们的蜘蛛侠还会继续爬取: " + e);
		SpiderResult spiderResult = spiderService.getByURL(url);// 更新一下对象的状态
		this.saveHistorySpider(spiderResult);// 历史信息处理一下
		spiderResult.setComments(null);
		return spiderResult;
	}

	/**
	 * 保存历史爬取结果
	 */
	@SuppressWarnings("unchecked")
	public boolean saveHistorySpider(SpiderResult spiderResult) {
		if (spiderResult != null) {
			List<SpiderHistoryResult> historyResultList = this.spiderService.getSpiderHistoryResultBySid(spiderResult.getId());
			if(historyResultList.size() <= 0) {
				// save
				SpiderHistoryResult historyResult = new SpiderHistoryResult();
				historyResult.setComments(spiderResult.getComments());
				historyResult.setName(spiderResult.getName());
				historyResult.setNumber(spiderResult.getLiveNumber());
				historyResult.setSpiderResultId(spiderResult.getId());
				historyResult.setSpinDate(new Date());
				this.spiderService.addSpiderHistoryResult(historyResult);
			}else {
				historyResultList.forEach(historyResult -> {
					// edit
					if (spiderResult.getComments() != null && !spiderResult.getComments().equals("[]")
							&& historyResult.getComments() != null && !historyResult.getComments().equals("[]")
							&& !historyResult.getComments().equals("null")) {
						List<String> list = Stream
								.concat(((List<String>) JSONObject.parse(historyResult.getComments())).stream(),
										((List<String>) JSONObject.parse(spiderResult.getComments())).stream())
								.collect(Collectors.toList());// 合并
						historyResult.setComments(JSONObject.toJSONString(list));
					}
					if (this.getNowFormatDate().equals(historyResult.getSpinDate())) {
						this.spiderService.editSpiderHistoryResult(historyResult);
					} else {
						this.spiderService.addSpiderHistoryResult(historyResult);
					}
				});
			}
			return true;
		}
		return false;
	}

	/**
	 * 获取 当前格式化的日期的对象
	 * 
	 * @return
	 */
	public Date getNowFormatDate() {
		try {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			return format.parse(format.format(new Date()));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

}
